/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.radaction.DAO;

import br.com.radaction.DTO.Curso;
import br.com.radaction.DTO.Disciplina;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 *Classe para conectar com o SGBD e fazer as operações de CRUD
 * Create,Retrieve,Update e Delete
 * @author robson
 */
public class DisciplinaDAO {

    Connection conexao;

    /**
     * Construtor único, para garantir a existência de uma conexão com um SGBD
     * @param conexao Connection já aberta com um SGBD
     */
    public DisciplinaDAO(Connection conexao) {
        this.conexao = conexao;
    }

    /**
     * Se a disciplina for válido, este método irá fazer o INSERT no SGBD.
     * O Código será inserido pela Sequência e será colocado novamente no objeto Disciplina
     * @param disciplina Disciplina a ser inserida
     * @throws java.sql.SQLException Qualquer erro entre o Sistema e o Banco será devolvido nesta Exceção
     */
    public void create(Disciplina disciplina) throws SQLException {
        String query = "INSERT INTO DISCIPLINA(COD,NOME,CODCURSO,OBSERVACAO)" +
                "VALUES(NEXTVAL('SEQDISCIPLINA'),?,?,?)";
        PreparedStatement pst = this.conexao.prepareStatement(query);
        pst.setString(1, disciplina.getNome());
        pst.setInt(2, disciplina.getCurso().getCod());
        pst.setString(3, disciplina.getObservacao());
        pst.executeUpdate();
        Statement st = this.conexao.createStatement();
        pst.close();
        st.close();
    }

    /**
     * Retorna a disciplina do SGBD de acordo com o código da tarefa recebido.
     * @param disciplina Disciplina a ser carregado do SGBD
     * @return Disciplina do SGBD
     * @throws java.sql.SQLException Qualquer erro entre o Sistema e o Banco será devolvido nesta Exceção
     */
    public Disciplina retrieve(Disciplina disciplina) throws SQLException {

        Disciplina disciplinaRet = new Disciplina();
        String query = "SELECT COD,NOME,CODCURSO,OBSERVACAO FROM DISCIPLINA WHERE COD=?";
        PreparedStatement pst = this.conexao.prepareStatement(query);
        pst.setInt(1, disciplina.getCod());
        ResultSet rs = pst.executeQuery();
        if (rs.next()) {
            disciplinaRet.setCod(rs.getInt("COD"));
            disciplinaRet.setNome(rs.getString("NOME"));
            disciplinaRet.setCurso(new Curso(rs.getInt("CODCURSO")));
            disciplinaRet.setObservacao(rs.getString("OBSERVACAO"));
        }
        rs.close();
        pst.close();
        return disciplinaRet;
    }

    /**
     * Atualiza a disciplina no SGBD.
     * @param disciplina Disciplina a ser atualizada no SGBD
     * @throws java.sql.SQLException Qualquer erro entre o Sistema e o Banco será devolvido nesta Exceção
     */
    public void update(Disciplina disciplina) throws SQLException {
        if (this.valida(disciplina)) {
            String query = "UPDATE DISCIPLINA SET NOME=?, OBSERVACAO=? WHERE COD=?";
            PreparedStatement pst = this.conexao.prepareStatement(query);
            pst.setString(1, disciplina.getNome());
            pst.setString(2, disciplina.getObservacao());
            pst.setInt(3, disciplina.getCod());
            pst.executeUpdate();
            pst.close();
        }
    }

    /**
     * Remove do SGBD a disciplina conforme o código presente na disciplina passada como argumento
     * @param av Avaliacao a ser excluída. Necessita apenas do atributo COD
     * @throws java.sql.SQLException Qualquer erro entre o Sistema e o Banco será devolvido nesta Exceção
     */
    public void delete(Disciplina disciplina) throws SQLException {
        String query = "DELETE FROM DISCIPLINA WHERE COD=?";
        PreparedStatement pst = this.conexao.prepareStatement(query);
        pst.setInt(1, disciplina.getCod());
        pst.executeUpdate();
        pst.close();
    }

    /**
     * Retorna uma Lista com todas as Disciplinas cadastrados no SGBD.
     * @return Lista com as Disciplinas
     * @throws java.sql.SQLException Qualquer erro entre o Sistema e o Banco será devolvido nesta Exceção
     */
    public List<Disciplina> listaTodos() throws SQLException {
        List<Disciplina> lista = new ArrayList<Disciplina>();
        String query = "SELECT COD,NOME,CODCURSO,OBSERVACAO FROM DISCIPLINA ORDER BY NOME";
        Statement st = this.conexao.createStatement();
        ResultSet rs = st.executeQuery(query);
        while (rs.next()) {
            Disciplina disciplina = new Disciplina(rs.getInt("COD"));
            disciplina.setNome(rs.getString("NOME"));
            Curso curso = new Curso(rs.getInt("CODCURSO"));
            CursoDAO cursoDAO = new CursoDAO(conexao);
            curso = cursoDAO.retrieve(curso);
            disciplina.setCurso(curso);
            disciplina.setObservacao(rs.getString("OBSERVACAO"));

            lista.add(disciplina);
        }
        rs.close();
        st.close();
        return lista;
    }

    /**
     * Aplica os testes para as regras de negócio
     * @param obj Disciplina a ser testada
     * @return true se a Disciplina atende as regras de negócio, ou false em caso contrário.
     */
    private boolean valida(Object obj) {
        boolean ret = false;
        if (obj instanceof Disciplina) {
            ret = true;
        }
        return ret;
    }
}
    

